package cn.uninasa.controller;

import org.springframework.web.bind.annotation.*;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * @ProjectName: uninasa-demo-session
 * @Package: cn.uninasa.controller
 * @ClassName: UserController
 * @Author: uninasa
 * @Description: 用户控制层
 * @Date: 2024/3/8 20:30
 */
@CrossOrigin(origins = "*", maxAge = 3600,allowCredentials="true")
@RestController
@RequestMapping(value = "user",produces = {"application/json; charset=UTF-8"})
public class UserController {
    /**
     * 获取用户信息
     * @param request:
     * @return: java.lang.String
     * @author: uninasa
     * @date: 2024/3/9 0:25
     */
    @GetMapping("getUserInfo")
    public String getUserInfo(HttpServletRequest request){
        //取出cookie中持久化的userId
        Cookie[] cookies=request.getCookies();
        if(cookies==null){
            return "当前没有登陆，请跳转";
        }
        String userId=null;
        for (Cookie cookie : cookies) {
            if("userId".equals(cookie.getName())){
                userId=cookie.getValue();
            }
        }
        //用获取到的userId去校验用户是否处于登陆状态（session是否被销毁）
        if(userId!=null){
            String userInfo= (String) request.getSession().getAttribute(userId);
            //未销毁，返回用户信息，用户正常访问页面
            if(userInfo!=null){
                return userInfo;
            }
        }
        //用户已经注销session，或者登陆状态已经失效，或者用户是第一次访问
        return "当前没有登陆，请跳转";
    }

    /**
     * 用户登陆
     * @param userId:
     * @param userPassword:
     * @param request:
     * @param response:
     * @return: java.lang.String
     * @author: uninasa
     * @date: 2024/3/9 0:25
     */
    @GetMapping("login")
    public String login(
            @RequestParam String userId,
            @RequestParam String userPassword,
            HttpServletRequest request,
            HttpServletResponse response){
        if("12345".equals(userId)&&"12345".equals(userPassword)){
            //向session中存入用户信息
            request.getSession().setAttribute("12345","用户名:张三\n用户id:12345\n");
            //设置session的声明周期时间，用户无操作到达300s后，用户登陆失效（注意这里是用户无操作30s后失效）
            request.getSession().setMaxInactiveInterval(300);
            //将用户的id存入cookie中，用于下次关闭浏览器再打开时，用户保持持久化登陆状态（在token方案中，将会由前端存储userId到localStorage）
            //TODO PS：这里的userId应该进行加密避免被他人纂改和模仿，其实就和token方案类似，只是这里的令牌过期采用了Session来处理
            Cookie cookie=new Cookie("userId","12345");
            //这里必须手动指定cookie的JSESSIONID为当前session的id，否则第二次打开浏览器时，浏览器会创建一个新的JSESSIONID，导致服务器创建新的session
            Cookie cookie2=new Cookie("JSESSIONID",request.getSession().getId());
            //这里必须设置cookie的失效时间，否则默认会在关闭浏览器时销毁cookie（因为cookie初始化时设置的生命周期时间为0）
            cookie.setMaxAge(300);
            cookie2.setMaxAge(300);
            response.addCookie(cookie);
            response.addCookie(cookie2);
            return "用户名:张三\n用户id:12345\n";
        }
        return "用户名密码错误";
    }

    /**
     * 注销当前用户
     * @param request
     */
    @GetMapping("logout")
    public void logout(HttpServletRequest request){
        //使当前session立即失效
        request.getSession().invalidate();
    }
}
